import java.io.*;

import java.util.Scanner;

public class DAY_Two {

    //数组中两个字符串的最小距离（模拟+贪心）
    //给定一个字符串数组strs，再给定两个字符串str1和str2，返回在strs中str1和str2的最小距离，如果str1或str2为null，或不在strs中，返回-1。
    //输入描述:
    //输入包含有多行，第一输入一个整数n
    //（1≤n≤10^5），代表数组strs的长度，第二行有两个字符串分别代表str1和str2，接下来n行，每行一个字符串，代表数组strs (保证题目中出现的所有字符串长度均小于等于10)。
    //输出描述:
    //输出一行，包含一个整数，代表返回的值。
    //示例1
    //输入
    //1
    //CD AB
    //CD
    //输出
    //-1
    //示例2
    //输入
    //5
    //QWER 666
    //QWER
    //1234
    //qwe
    //666
    //QWER
    //输出
    //1
    //思路：小贪心，或者是小dp：
    //用prev1标记i位置之前最近一次出现的第一个字符串的下标；
    //用prev2标记i位置之前最近一次出现的第二个字符串的下标。
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(reader.readLine());
        String[] str = reader.readLine().split(" ");
        String s1 = str[0], s2 = str[1];

        int prev1 = -1, prev2 = -1, ret = 0x3f3f3f3f;
        for (int i = 0; i < n; i++) {
            String s = reader.readLine();
            if (s.equals(s1)){
                if (prev2 != -1){
                    ret = Math.min(ret,i-prev2);
                }
                prev1 = i;
            }else if (s.equals(s2)){
                if (prev1 != -1){
                    ret = Math.min(ret,i-prev1);
                }
                prev2 = i;
            }
        }
        System.out.println(ret == 0x3f3f3f3f ? -1 : ret);
    }

    //最小花费爬楼梯（动态规划-线性dp
    //描述
    //给定一个整数数组
    //cost  ，其中
    //cost[i]  是从楼梯第i 个台阶向上爬需要支付的费用，下标从0开始。一旦你支付此费用，即可选择向上爬一个或者两个台阶。
    //你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
    //请你计算并返回达到楼梯顶部的最低花费。
    //数据范围：数组长度满足：1≤n≤10^5，数组中的值满足：1≤cost[i]≤10^4
    //输入描述：
    //第一行输入一个正整数 n ，表示数组 cost 的长度。
    //第二行输入 n 个正整数，表示数组 cost 的值。
    //输出描述：
    //输出最低花费
    //示例1
    //输入：
    //3
    //2 5 20
    //输出：
    //5
    //说明：你将从下标为1的台阶开始，支付5 ，向上爬两个台阶，到达楼梯顶部。总花费为5
    //示例2
    //输入：
    //10
    //1 100 1 1 1 90 1 1 80 1
    //0 0   1 2 2 3  3 4 4  5 6
    //输出：
    //6
    //说明：你将从下标为 0 的台阶开始。
    //1.支付 1 ，向上爬两个台阶，到达下标为 2 的台阶。
    //2.支付 1 ，向上爬两个台阶，到达下标为 4 的台阶。
    //3.支付 1 ，向上爬两个台阶，到达下标为 6 的台阶。
    //4.支付 1 ，向上爬一个台阶，到达下标为 7 的台阶。
    //5.支付 1 ，向上爬两个台阶，到达下标为 9 的台阶。
    //6.支付 1 ，向上爬一个台阶，到达楼梯顶部。
    //总花费为 6 。
    public static void main2(String[] args) {
        Scanner s = new Scanner(System.in);
        int n =s.nextInt();
        int[] cost = new int[n];
        int[] dp = new int[n+1];

        for (int i = 0; i < n; i++) {
            cost[i] = s.nextInt();
        }

        for (int i = 2; i <= n; i++) {
            dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }

        System.out.println(dp[n]);
    }


    //牛牛的快递
    //描述
    //牛牛正在寄快递，他了解到快递在 1kg 以内的按起步价 20 元计算，
    // 超出部分按每 kg 1元计算，不足 1kg 部分按 1kg计算。
    // 如果加急的话要额外付五元，请问牛牛总共要支付多少快递费
    //输入描述：
    //第一行输入一个单精度浮点数 a 和一个字符 b ，a 表示牛牛要寄的快递的重量，
    // b表示牛牛是否选择加急，'y' 表示加急 ，'n' 表示不加急。
    //输出描述：
    //输出牛牛总共要支付的快递费用
    //示例1
    //输入：
    //1.5 y
    //输出：
    //26
    //示例2
    //输入：
    //0.7 n
    //输出：
    //20
    //思路：
    public static void main1(String[] args) {
        Scanner s = new Scanner(System.in);

        double a = s.nextDouble();
        char b = s.next().charAt(0);

        int ret = 0;
        if(a<=1){
            ret = 20;
        }else{
            ret = 20 +(int)Math.ceil(a-1);
        }

        if (b =='y') ret+=5;

        System.out.println(ret);

    }
}
